// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 19.1.2.1
description: Invoked with a source which does not have a descriptor for an own property
info: |
    [...]
    5. For each element nextSource of sources, in ascending index order,
       [...]
       c. Repeat for each element nextKey of keys in List order,
          i. Let desc be from.[[GetOwnProperty]](nextKey).
          ii. ReturnIfAbrupt(desc).
          iii. if desc is not undefined and desc.[[Enumerable]] is true, then
features: [Proxy]
---*/

function Test() {
    var callCount = 0;
    var target = {};
    var result;
    var source = new Proxy({}, {
      ownKeys: function() {
        callCount += 1;
        return ['missing'];
      }
    });

    result = Object.assign(target, source);

    assert.sameValue(callCount, 1, 'Proxy trap was invoked exactly once');
    assert.sameValue(
      Object.hasOwnProperty.call(target, 'missing'),
      false,
      'An own property was not created for a property without a property descriptor'
    );
    assert.sameValue(result, target);
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
